package com.study.spmongodb.book.wwj.char19;

/**
 * @author MI
 * @version 1.0
 * @date 2020/11/30 10:00
 */
public class FutureTask<T> implements Future<T> {

    //计算结果
    private T result;

    //任务是否完成
    private boolean isDone = false;

    //定义对象锁
    private final Object LOCK = new Object();

    @Override
    public T get() throws InterruptedException {
        synchronized (LOCK) {
            //当前任务还没完成，调用get方法会挂起而进入阻塞
            while (!isDone) {
                LOCK.wait();
            }
            //返回结算结果
            return result;
        }
    }

    //finish方法主要用于FutureTask设置即计算结果
    protected void finish(T result) {
        synchronized (LOCK) {
            //balking 设计模式
            if (isDone) {
                return;
            }
            //计算完成，为 result 指定结果，并且将isDone设为 true，同时唤醒阻塞中的线程
            this.result = result;
            this.isDone = true;
            LOCK.notifyAll();
        }
    }

    /**
     * 返回当前任务是否已经完成
     *
     * @return
     */
    @Override
    public boolean done() {
        return isDone;
    }
}
